package com.fs.service.Impl;

import com.fs.dto.ProductAddDTO;
import com.fs.entity.Product;
import com.fs.mapper.ProductGalleryMapper;
import com.fs.mapper.ProductMapper;
import com.fs.mapper.ProductTagMapper;
import com.fs.service.ProductService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

/**
 * 商品业务逻辑实现类
 * 包含商品的添加、查询、更新、删除等具体实现
 */
@Service
@Slf4j
public class ProductServiceImpl implements ProductService {

    @Autowired
    private ProductMapper productMapper;

    @Autowired
    private ProductTagMapper productTagMapper;

    @Autowired
    private ProductGalleryMapper productGalleryMapper;

    /**
     * 添加商品
     * 设置创建时间与更新时间由后端生成，避免前端篡改
     */
    @Override
    public void addProduct(ProductAddDTO dto) {
        Product product = new Product();
        BeanUtils.copyProperties(dto, product);
        product.setCreateTime(LocalDateTime.now());
        product.setUpdateTime(LocalDateTime.now());
        product.setStatus(1); // 默认上架
        productMapper.insert(product);
        log.info("商品添加成功：{}", product.getName());
    }

    /**
     * 根据ID查询商品
     */
    @Override
    public Product getById(Long id) {
        Product product = productMapper.getById(id);
        log.info("查询商品：{}", product);
        return product;
    }

    /**
     * 更新商品信息
     * 更新时仅修改字段与更新时间
     */
    @Override
    public void updateProduct(Product product) {
        product.setUpdateTime(LocalDateTime.now());
        productMapper.update(product);
        log.info("更新商品成功：{}", product.getId());
    }

    /**
     * 批量删除商品
     * 删除顺序：标签表 → 图片表 → 商品表
     */
    @Override
    public void deleteBatch(List<Long> ids) {
        log.info("开始批量删除商品，数量：{}", ids.size());
        // 删除标签记录
        productTagMapper.deleteByProductIds(ids);
        // 删除图片记录
        productGalleryMapper.deleteByProductIds(ids);
        // 删除商品本身
        productMapper.deleteByIds(ids);
        log.info("商品批量删除完成");
    }

    /*商品启售停售*/
    public void changeStatus(Long id, Integer status) {
        // 只允许 0 或 1，防护检查
        if (id == null || (status != null && status != 0 && status != 1)) {
            throw new IllegalArgumentException("参数非法");
        }
        Product p = new Product();
        p.setId(id);
        p.setStatus(status);
        p.setUpdateTime(LocalDateTime.now());
        productMapper.updateSelective(p);
        log.info("[ProductService] 修改商品状态 id={} status={}", id, status);
    }

    /**
     * 条件查询（无分页）——返回 ProductVO 或 Product 实体的列表
     */
    public List<?> queryByCondition(String name, String type, String tag, Integer status, String sortField, String sortOrder) {
        // 后端需要对 sortField 做白名单校验，避免 SQL 注入风险
        // 允许排序字段白名单（示例）
        Set<String> ALLOWED_SORT_FIELDS = new HashSet<>(Arrays.asList("create_time", "update_time", "price", "name"));
        if (sortField != null && !ALLOWED_SORT_FIELDS.contains(sortField)) {
            // 若非法，使用默认
            sortField = null;
            sortOrder = null;
        }

        // sortOrder 只能为 asc 或 desc
        if (sortOrder != null) {
            String s = sortOrder.toLowerCase();
            if (!"asc".equals(s) && !"desc".equals(s)) {
                sortOrder = null;
            } else {
                sortOrder = s;
            }
        }

        // status 若为空则默认返回启售商品（对外查询）——注意管理端可传 status=null 来查全部
        if (status == null) {
            status = 1;
        }

        // 调用 mapper 执行动态 SQL 查询（Mapper 会处理动态条件）
        return productMapper.selectByCondition(name, type, tag, status, sortField, sortOrder);
    }
}
